package leetcode;

/**
 * //给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 * //
 * // 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 * //
 * // 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 * //
 * // 示例：
 * //
 * // 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * //输出：7 -> 0 -> 8
 * //原因：342 + 465 = 807
 * //
 *
 * @author zhanghongjiang
 * @version 1.0
 * @date 2021/9/8 21:33
 */
public class 两数相加_2 {

   public class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode resultNode = new ListNode(-1);
        add(l1,l2,resultNode.next,false);
        return resultNode.next;
    }

    public void add(ListNode l1,ListNode l2,ListNode resultNode ,boolean plus1){
       if(resultNode == null){
           resultNode = new ListNode();
       }

       if(l1 == null && l2 == null){
           if(plus1){
               resultNode.val = 1;
           }
           return ;
       }else if(l1 != null && l2 != null){
           int sum = l1.val + l2.val + (plus1 ? 1 : 0);
           if(sum >= 10){
               sum = sum % 10;
               plus1 = true;
           }else{
               plus1 = false;
           }
           resultNode.val = sum;
           add(l1.next,l2.next,resultNode.next,plus1);
       }else{
           if(l1 == null){
               l1 = new ListNode(0);
               add(l1,l2,resultNode,plus1);
           }else{
               l2 = new ListNode(0);
               add(l1,l2,resultNode,plus1);
           }
       }
    }
}
